const fs = require('fs');
function getFileByPath(fPath) {
    return new Promise(function (resolve, reject) {
        fs.readFile(fPath, 'utf-8', (err, dataStr) => {
            if (err) return reject(err);
            resolve(dataStr);
        })
    });
}
// 先读取文件1，在读取2，最后读取3
// 注意：通过 .then 指定 回调函数的时候，成功的 回调函数，必须传，但是，失败的回调，可以省略
// 不传
// 这是一个错误的示范，千万不要这么用
/* getFileByPath('./files/1.txt')
    .then(function(data){
        console.log(data);

        getFileByPath('./files/2.txt')
        .then(function(data){
            console.log(data);

            getFileByPath('./files/3.txt')
            .then(function(data){
                console.log(data);
            })
        })
    }) */




// 读取文件1
// 在上一个 .then 中，返回一个新的Promise 实例，可以继续用下一个 .then 来处理，预先指定成功和失败的回调(异步操作完之后调用)

// 如果，前面的 Promise 执行失败，我们不想让后续的Promise 操作被终止，可以为每一个 Promise
// 指定 失败的回调 
/*getFileByPath('./files/11.txt')
// 第一个Promise执行失败之后 后续的.then(用于给上一个Promise预先指定成功和失败回调)不执行
    .then(function(data){  // 异步执行完后调用
        console.log(data);

        // 读取文件2
        return getFileByPath('./files/2.txt');
    }, function(err){
        console.log(err.message);
        // return 一个新的 Promise 不影响后续执行
        return getFileByPath('./files/2.txt');
    })
    .then(function(data){
        console.log(data);

        return getFileByPath('./files/3.txt');
    })
    .then(function(data){
        console.log(data);
    });

    console.log('okokok');*/


// 当我们有这样的需求：哪怕前面的 Promise 执行失败了，但是不要影响后续 Promise 的正常执行
// 此时，我们可以单独为每个Promise,通过.then指定一下失败的回调

// 有时候，我们有这样的需求，上面的需求刚好相反：如果 后续的Promise执行，依赖于 前面的
// Promise执行的结果 如果前面的失败了 则后面的就没有继续执行下去的意义了 此时， 我们想要实现
// ，一旦报错，则立即终止所有的 Promise的执行
getFileByPath('./files/1.txt')
    .then(function (data) {
        console.log(data);

        // 读取文件2
        return getFileByPath('./files/22.txt');
    })
    .then(function (data) {
        console.log(data);

        return getFileByPath('./files/3.txt');
    })
    .then(function (data) {
        console.log(data);
    })
    .catch(function (err) { // catch 的作用；如果前面有任何的 Promise执行失败了
        // 则立即终止后续所有 Promise 的执行 并马上进入 catch去处理Promise中抛出的异常
        console.log(err.message);
        // 相当于.then中第二个回调函数
    })

console.log('okokok');